// https://www.nowcoder.com/practice/3911a20b3f8743058214ceaa099eeb45

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        if (aim == 0) {
            return 0;
        }

        vector<int> dp(5005, INT_MAX);
        dp[0] = 0;
        for (int i=0; i < arr.size(); i++) {
            for (int j=arr[i]; j <= aim; j++) {
                if (dp[j-arr[i]] != INT_MAX) {
                    dp[j] = min(dp[j], dp[j-arr[i]] + 1);
                }
            }
        }

        if (dp[aim] == INT_MAX) {
            return -1;
        }
        return dp[aim];
    }
};